package 反射;

import com.jiazhong.Model.Goods;

import java.lang.reflect.Field;
import java.lang.reflect.Modifier;

/**
 * 使用反射获得类中的属性并调用属性
 * 使用反射的步骤：
 * 1.获得类的字节码对象
 * 2.获得类中的属性
 */
public class FieldDemo {
    public static void main(String[] args) throws NoSuchFieldException, InstantiationException, IllegalAccessException {
//        getFields();
        getFiled();
    }

    private static void getFields() {
        //获得类的字节码
        Class cla= Goods.class;
        //获得类中的属性

        //cla.getFields用于获取子类及其父类中所有public的属性
//        Field[] fields = cla.getFields();
        //获得所有本类中的属性，但是不能获取父类中的属性
        Field[] fields = cla.getDeclaredFields();
        for (Field field :fields) {
            //获取属性数组
//            System.out.println(field);
            //获取属性名
            String fieldName = field.getName();
            //获取属性类型
            Class fieldType = field.getType();
            //获取属性的修饰符,返回值是表示修饰符的一个字段常量为int型的
            int modifiers_num = field.getModifiers();
            //将int类型的修饰符解码为具体的修饰符字符串
            String modifiers_str = Modifier.toString(modifiers_num);
            System.out.println(fieldName+" | "+fieldType+" | "+modifiers_str);
        }
    }
    public static void getFiled() throws NoSuchFieldException, InstantiationException, IllegalAccessException {
        //获取Goods的字节码对象
        Class cla=Goods.class;
        System.out.println(cla);               //可理解为路径
        //根据属性名获取一个属性对象
        Field field = cla.getDeclaredField("goods_name");
        System.out.println(field);               //可理解为属性及其修饰符
        field.setAccessible(true);//去掉权限限制
        //创建类的对象（通过无参构造方法创建）
        Object obj = cla.newInstance();          //可理解为创建对象
        System.out.println(obj);
        //调用属性
        field.set(obj,"小花");                    //可理解为设置对象的单个属性值
        System.out.println(obj);
        //获得属性的值
        Object o = field.get(obj);                //可理解为从obj（对象）中取出field（单个属性）的值
        System.out.println(o);
    }
}
